<?php

// +----------------------------------------------------------------------
// | 应用程序类 执行应用过程管理
// +----------------------------------------------------------------------

class app {

	//应用程序初始化
	static public function init() {

		// 设定错误和异常处理
		set_error_handler(array('app', 'appError'));
		set_exception_handler(array('app', 'appException'));

		//设置系统时区 PHP5支持
		if (function_exists('date_default_timezone_set'))
			date_default_timezone_set(C('DEFAULT_TIMEZONE'));

		//读取分组配置文件
		if (is_file(APP_PATH . '/' . GROUP_NAME . '/conf/config.inc.php')) {
			C(include APP_PATH . '/' . GROUP_NAME . '/conf/config.inc.php');
		}

		//加载当前分组函数文件
		if (is_file(APP_PATH . '/' . GROUP_NAME . '/function/function.fun.php')) {
			require (APP_PATH . '/' . GROUP_NAME . '/function/function.fun.php');
		}

		// 读取扩展配置文件
		$list = C('APP_CONFIG_LIST');
		foreach ($list as $val) {
			if (is_file(APP_PATH . '/' . GROUP_NAME . '/' . $val . '.php'))
				C('_' . $val . '_', array_change_key_case(include APP_PATH . '/' . GROUP_NAME . '/' . $val . '.php'));
		}

		// 如果是调试模式加载调试模式配置文件
		if (C('APP_DEBUG')) {

			//加载系统默认的开发模式配置文件
			C(include FEE_PATH . '/conf/debug.inc.php');

			//加载分组调试文件
			if (is_file(APP_PATH . '/' . GROUP_NAME . '/conf/debug.inc.php')) {
				require (APP_PATH . '/' . GROUP_NAME . '/conf/debug.inc.php');
			}
		}

		if (C('SESSION_AUTO_START'))
			session_start();

		// 系统检查
		app::checkLanguage();  //语言检查
		app::checkTemplate();  //模板检查
		// 开启静态缓存
		if (C('HTML_CACHE_ON'))
			html_cache::readHTMLCache();
		return;
	}

	//语言检查 检查浏览器支持语言，并自动加载语言包
	static private function checkLanguage() {
		$langSet = C('DEFAULT_LANG');

		// 不开启语言包功能，仅仅加载框架语言文件直接返回
		if (!C('LANG_SWITCH_ON')) {
			L(include FEE_PATH . '/lang/' . $langSet . '.php');
			return;
		}

		// 启用了语言包功能 根据是否启用自动侦测设置获取语言选择
		if (C('LANG_AUTO_DETECT')) {
			if (isset($_GET[C('VAR_LANGUAGE')])) {// 检测浏览器支持语言
				$langSet = $_GET[C('VAR_LANGUAGE')]; // url中设置了语言变量
				cookie('fee_language', $langSet);
			} elseif (cookie('fee_language'))// 获取上次用户的选择
				$langSet = cookie('fee_language');
			elseif (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {// 自动侦测浏览器语言
				preg_match('/^([a-z\-]+)/i', $_SERVER['HTTP_ACCEPT_LANGUAGE'], $matches);
				$langSet = strtolower($matches[1]);
				cookie('fee_language', $langSet);
			}
		}

		// 定义当前语言
		define('LANG_SET', strtolower($langSet));

		// 加载框架语言包
		L(include FEE_PATH . '/lang/' . LANG_SET . '.php');

		// 加载项目公共语言包
		if (is_file(LANG_PATH . '/' . LANG_SET . '.php'))
			L(include LANG_PATH . '/' . LANG_SET . '.php');

		//加载项目分组语言包
		if (is_file(APP_PATH . '/' . GROUP_NAME . '/lang/' . LANG_SET . '.php'))
			L(include APP_PATH . '/' . GROUP_NAME . '/lang/' . LANG_SET . '.php');
	}

	//模板检查，如果不存在使用默认
	static private function checkTemplate() {
		if (C('TPL_DETECT_THEME')) {// 自动侦测模板主题
			$t = C('VAR_TEMPLATE');
			if (isset($_GET[$t])) {
				$templateSet = $_GET[$t];
				cookie('fee_template', $templateSet, 3600);
			} else {
				if (cookie('fee_template')) {
					$templateSet = cookie('fee_template');
				} else {
					$templateSet = C('DEFAULT_THEME');
					cookie('fee_template', $templateSet, 3600);
				}
			}
			//模版不存在的话，使用默认模版
			if (!is_dir(TPL_PATH . '/' . $templateSet))
				$templateSet = C('DEFAULT_THEME');
		}else {
			$templateSet = C('DEFAULT_THEME');
		}

		//模版名称
		define('TEMPLATE_NAME', $templateSet);

		// 当前模版路径
		define('TEMPLATE_PATH', TPL_PATH . '/' . TEMPLATE_NAME);

		//模板url根目录
		$appRoot = __ROOT__ . '/' . GROUP_NAME;

		C('CACHE_PATH', CACHE_PATH . '/' . GROUP_NAME);

		//当前操作模板路径
		C('TPL_FILE_NAME', TEMPLATE_PATH . '/' . MODULE_NAME . '_' . ACTION_NAME . C('TPL_TEMPLATE_SUFFIX'));

		//当前模板主目录
		define('__TPL__', $appRoot . '/' . TPL_DIR);

		//项目模板目录
		define('__THEME__', __TPL__ . '/' . TEMPLATE_NAME);

		//项目公众目录
		define('APP_PUBLIC_PATH', $appRoot . '/' . TPL_DIR . '/public');

		//网站公共文件目录
		define('WEB_PUBLIC_PATH', __ROOT__ . '/public');
		return;
	}

	//执行应用程序
	static public function exec() {
		// 安全检测
		if (!preg_match('/^[A-Za-z_0-9]+$/', MODULE_NAME)) {
			throw_exception(L('_MODULE_NOT_EXIST_'));
		}
		//创建action控制器实例
		$module = A(MODULE_NAME, GROUP_NAME);
		if (!$module) {
			// 是否定义Empty模块
			$module = A('empty', GROUP_NAME);
			if (!$module)
				throw_exception(L('_MODULE_NOT_EXIST_') . ' ' . GROUP_NAME . ' - ' . MODULE_NAME);
		}
		call_user_func(array(&$module, ACTION_NAME)); //执行操作
		return;
	}

	//运行应用实例 入口文件使用的快捷方法
	static public function run() {
		app::init();
		// 记录应用初始化时间
		if (C('SHOW_RUN_TIME'))
			$GLOBALS['_initTime'] = microtime(TRUE);
		app::exec();
		// 保存日志记录
		if (C('LOG_RECORD'))
			log::save();
		return;
	}

	/**
	  +----------------------------------------------------------
	 * 自定义异常处理
	  +----------------------------------------------------------
	 * @param mixed $e 异常对象
	  +----------------------------------------------------------
	 */
	static public function appException($e) {
		halt($e->__toString());
	}

	/**
	  +----------------------------------------------------------
	 * 自定义错误处理
	  +----------------------------------------------------------
	 * @param int $errno 错误类型
	 * @param string $errstr 错误信息
	 * @param string $errfile 错误文件
	 * @param int $errline 错误行数
	  +----------------------------------------------------------
	 * @return void
	  +----------------------------------------------------------
	 */
	static public function appError($errno, $errstr, $errfile, $errline) {
		switch ($errno) {
			case E_ERROR:
			case E_USER_ERROR:
				$errorStr = "[$errno] $errstr " . basename($errfile) . " 第 $errline 行.";
				if (C('LOG_RECORD'))
					log::write($errorStr, log::ERR);
				halt($errorStr);
				break;
			case E_STRICT:
			case E_USER_WARNING:
			case E_USER_NOTICE:
			default:
				$errorStr = "[$errno] $errstr " . basename($errfile) . " 第 $errline 行.";
				log::record($errorStr, log::NOTICE);
				break;
		}
	}

}

?>